#!/bin/bash


###############################################################################
# Funcion que formatea la informacion de configuracion para ser mostrada 
# en pantalla
function MOSTRAR_RESUMEN() {
	getAssoc 'CONFIGURACION' CONFDIR 'CONFDIR'
	echo " - Libreria del Sistema: ${CONFDIR}"
	ls -1 ${CONFDIR} | sed 's/.*/ --- &/'
	
	getAssoc 'CONFIGURACION' BINDIR 'BINDIR'
	echo " - Ejecutables: ${BINDIR}"
	ls -1 ${BINDIR} | sed 's/.*/ --- &/'
	
	getAssoc 'CONFIGURACION' MAEDIR 'MAEDIR'
	echo " - Archivos maestros: ${MAEDIR}"
	ls -1 ${MAEDIR} | sed 's/.*/ --- &/'

	getAssoc 'CONFIGURACION' ARRIDIR 'ARRIDIR'
	echo " - Directorio de arribo de archivos externos: ${ARRIDIR}"

	getAssoc 'CONFIGURACION' ACEPDIR 'ACEPDIR'
	echo " - Archivos externos aceptados: ${ACEPDIR}"

	getAssoc 'CONFIGURACION' RECHDIR 'RECHDIR'
	echo " - Archivos externos rechazados: ${RECHDIR}"
	
	getAssoc 'CONFIGURACION' PROCDIR 'PROCDIR'
	echo " - Archivos procesados: ${PROCDIR}"

	getAssoc 'CONFIGURACION' REPODIR 'REPODIR'
	echo " - Reportes de salida: ${REPODIR}"

	getAssoc 'CONFIGURACION' LOGDIR 'LOGDIR'
	echo " - Logs de auditoria del Sistema: ${LOGDIR}" 
	echo 
	echo "Estado del sistema: INICIALIZADO"
}


###############################################################################
# Funciones que emulan arrays asociativos en BASH
###############################################################################

###############################################################################
# Funcion que setea un valor en el array asociativo:
# Modo de uso:
# set nombreArray clave valor
#
# Ejemplo: setAssoc miArray color rojo
function setAssoc {
	NOMBRE_ARRAY=$1
	CLAVE=$2
	VALOR=$3
	eval "local CANTIDAD=\${#$NOMBRE_ARRAY[@]}"
	eval "$NOMBRE_ARRAY[$CANTIDAD]=${CLAVE}:${VALOR}"
}


###############################################################################
# Funcion que obtiene el valor de la clave pasada en el array asociativo:
# Modo de uso:
# get nombreArray clave nombreVariableRetorno
#
# Ejemplo: getAssoc miArray color miRetorno
function getAssoc {
	local j=0
	NOMBRE_ARRAY=$1
	CLAVE=$2
	NOMBRE_RETORNO=$3

	eval "local CANTIDAD=\${#$NOMBRE_ARRAY[@]}"
	for (( j=0; j<$CANTIDAD; j++ ));
	do
		eval "local LINEA_ASSOC=\${$NOMBRE_ARRAY[$j]}"
		VARIABLE=`echo $LINEA_ASSOC | cut -d\: -f1`
		VALOR=`echo $LINEA_ASSOC | cut -d\: -f2`

		if [ $VARIABLE == $CLAVE ]
		then
			eval "$NOMBRE_RETORNO=$VALOR"
		fi
	done;
}


###############################################################################
# Funcion que obtiene un array con todas las keys del asociativo
# Modo de uso:
# getAssocKeys nombreArray nombreArrayRetorno
#
# Ejemplo: getAssocKeys miArray misClaves
function getAssocKeys {
	local i=0
	local NOMBRE_ARRAY=$1
	local NOMBRE_RETORNO=$2

	eval "local CANTIDAD=\${#$NOMBRE_ARRAY[@]}"
	for (( i=0; i < $CANTIDAD; i++ ));
	do
		eval "local LINEA_ASSOC=\${$NOMBRE_ARRAY[$i]}"
		VARIABLE=`echo $LINEA_ASSOC | cut -d\: -f1`
		eval "$NOMBRE_RETORNO[\${#$NOMBRE_RETORNO[@]}]=$VARIABLE"
	done
}	

	

###############################################################################
# Impresion del encabezado
clear
echo "TP SO7508 Segundo Cuatrimestre 2012. Tema w Copyright © Grupo 08"
echo


###############################################################################
# Verifico que el comando no haya sido ejecutado en esta misma sesion (shell)
if [ $INICIARW5_EJECUTADO ]
then
	LoguearW5.sh IniciarW5 'E' '10'
	echo "La iniciacion ya fue ejecutada en esta sesion de usuario."
	MOSTRAR_RESUMEN
	exit 2
else
	INICIARW5_EJECUTADO=1
fi
echo 
echo


###############################################################################
# Obtengo las variables del archivo de configuracion y las guardo en un 
# array asociativo donde almacenare las configuraciones de la aplicacion.
# Esta variable va a ser exportada al comando siguiente para su uso.
CONFIGURACION=( )
DIRECTORIOS_EXISTENTES=( )

ERRORES_DE_INSTALACION=( )
VARIABLES_FALTANTES=( )


# Ubicacion del archivo de configuracion
NUMERO_GRUPO="08"
ARCHIVO_CONFIGURACION="${HOME}/.grupo${NUMERO_GRUPO}/InstalaW5.conf"


# Arrays asociativos para validación de que la instalación haya finalizado
# con exito.
DIRECTORIOS=( 'CONFDIR' 'BINDIR' 'MAEDIR' 'ARRIDIR' 'ACEPDIR' 'RECHDIR' 'PROCDIR' 'REPODIR' 'LOGDIR' )
DIRECTORIOS_ESCRITURA=( 'CONFDIR' 'ARRIDIR' 'ACEPDIR' 'RECHDIR' 'PROCDIR' 'REPODIR' 'LOGDIR' )
VARIABLES=('GRUPO' 'SECUENCIA1' 'SECUENCIA2' 'CONFDIR' 'BINDIR' 'MAEDIR' 'ARRIDIR' 'ACEPDIR' 'RECHDIR' 'PROCDIR' 'REPODIR' 'LOGDIR' 'LOGEXT' 'LOGSIZE' 'DATASIZE' )
ARCHIVOS_MAESTROS=( 'patrones' 'sistemas' )
COMANDOS_SISTEMA=( 'LoguearW5.sh' 'MirarW5.sh' 'MoverW5.sh' 'DetectaW5.sh' 'StartD.sh' 'BuscarW5.sh' 'ListarW5.pl' )


##############################################################################
# Validacion de existencia del archivo de configuracion
if [ ! -f "$ARCHIVO_CONFIGURACION" ]
then
	LoguearW5.sh IniciarW5 'E' '16'
	echo "No se pudo encontrar el archivo de configuracion"
	exit 1
fi


##############################################################################
# Verificacion de existencia de los directorios
for (( i=0;i<${#DIRECTORIOS[@]};i++)); 
do
	DIRECTORIO=${DIRECTORIOS[$i]}
	LINEA_CONFIGURACION=`cat $ARCHIVO_CONFIGURACION | grep -v "^[ ]*#.*$" | grep $DIRECTORIO`
	
	VARIABLE=`echo $LINEA_CONFIGURACION | cut -d\= -f1`
	VALOR=`eval echo $LINEA_CONFIGURACION | cut -d\= -f2`

	if [ "$LINEA_CONFIGURACION" ]
	then
		if [ -d $VALOR ]
		then
			setAssoc 'DIRECTORIOS_EXISTENTES' $VARIABLE $VALOR
		else
			ERRORES_DE_INSTALACION[${#ERRORES_DE_INSTALACION[@]}]="No existe el directorio ${VARIABLE} en ${VALOR}"
		fi
	else
	    VARIABLES_FALTANTES[${#VARIABLES_FALTANTES[@]}]=$DIRECTORIO	
	fi
done


############################################################################ti#
# Verificacion de variables de configuracion
for (( i=0; i<${#VARIABLES[@]}; i++));
do
	VARIABLE=${VARIABLES[${i}]}
	LINEA_CONFIGURACION=`cat $ARCHIVO_CONFIGURACION | grep -v "^[ ]*#.*$" | grep $VARIABLE`
	
	if [ "$LINEA_CONFIGURACION" ]
	then
		VALOR=`eval echo $LINEA_CONFIGURACION | cut -d\= -f2`
                
 		setAssoc 'CONFIGURACION' $VARIABLE $VALOR
	else
		ERRORES_DE_INSTALACION[${#ERRORES_DE_INSTALACION[@]}]="No existe la variable $VARIABLE en la configuracion"
	fi

done



##############################################################################
# Verificacion de permisos de escritura en directorios de salida
CANTIDAD_ESCRITURA=${#DIRECTORIOS_ESCRITURA[@]}
for (( i=0;i<$CANTIDAD_ESCRITURA;i++));      
do
	getAssoc 'DIRECTORIOS_EXISTENTES' ${DIRECTORIOS_ESCRITURA[$i]} 'DIRECTORIO'
	if [ -d $DIRECTORIO ]
	then
		if [ ! -w $DIRECTORIO ]
		then
			ERRORES_DE_INSTALACION[${#ERRORES_DE_INSTALACION[@]}]="No hay permisos de escritura en el directorio $DIRECTORIO"
		fi
	fi
done


##############################################################################
# Miro permisos de archivos
getAssoc 'CONFIGURACION' 'MAEDIR' DIRECTORIO_MAESTROS
if [ $DIRECTORIO_MAESTROS -a -d $DIRECTORIO_MAESTROS ]
then
        CANT_MAESTROS=${#ARCHIVOS_MAESTROS[@]}
        for ((i=0; i<CANT_MAESTROS; i++));
        do
		if [ ! -f ${DIRECTORIO_MAESTROS}"/"${ARCHIVOS_MAESTROS[${i}]} ]
                then
                        ERRORES_DE_INSTALACION[${#ERRORES_DE_INSTALACION[@]}]="No existe el archivo maestro: ${DIRECTORIO_MAESTROS}${ARCHIVOS_MAESTROS[${i}]}"

		elif [ ! -r ${DIRECTORIO_MAESTROS}"/"${ARCHIVOS_MAESTROS[${i}]} ]
                then
                        ERRORES_DE_INSTALACION[${#ERRORES_DE_INSTALACION[@]}]="No hay permisos sobre el archivo maestro: ${DIRECTORIO_MAESTROS}${ARCHIVOS_MAESTROS[${i}]}"
                fi
        done
fi


##############################################################################
# Verificacion de los archivos de comandos
getAssoc 'CONFIGURACION' 'BINDIR' DIRECTORIO_EJECUTABLES
if [ $DIRECTORIO_EJECUTABLES -a -d $DIRECTORIO_EJECUTABLES ]
then
	CANT_COMANDOS=${#COMANDOS_SISTEMA[@]}
	for ((i=0; i<CANT_COMANDOS; i++));
	do
		if [ ! -f ${DIRECTORIO_EJECUTABLES}"/"${COMANDOS_SISTEMA[${i}]} ]
		then
			ERRORES_DE_INSTALACION[${#ERRORES_DE_INSTALACION[@]}]="No existe el comando: ${DIRECTORIO_EJECUTABLES}${COMANDOS_SISTEMA[${i}]}"
		
		elif [ ! -x ${DIRECTORIO_EJECUTABLES}"/"${COMANDOS_SISTEMA[${i}]} ]
		then	
			ERRORES_DE_INSTALACION[${#ERRORES_DE_INSTALACION[@]}]="No hay permisos de ejecucion del comando: ${DIRECTORIO_EJECUTABLES}/${COMANDOS_SISTEMA[${i}]}"
		fi
	done
fi



###############################################################################
# Seteo variable PATH, solo si se encuentra en la configuracion
getAssoc 'CONFIGURACION' 'BINDIR' DIRECTORIO_EJECUTABLES
if [ -d ${DIRECTORIO_EJECUTABLES} ] 
then
	PATH=$PATH:${DIRECTORIO_EJECUTABLES}
fi


###############################################################################
# En caso que existan errores en la instalacion, se muestra el detalle, 
# tal como fue indicado en el enunciado.
if [ ${#ERRORES_DE_INSTALACION[@]} -gt 0 ]
then
	echo "La instalacion no ha sido concluida. Detalles:"
	for (( i=0;i<${#ERRORES_DE_INSTALACION[@]};i++ ))
	do
		MSG="${ERRORES_DE_INSTALACION[$i]}"
		echo " - $MSG"
	done

	getAssoc 'CONFIGURACION' 'BINDIR' DIRECTORIO_EJECUTABLES
	if [ -d DIRECTORIO_EJECUTABLES ]
	then
		echo
			echo "Componentes existentes:"
			echo " - Ejecutables:"

			ls -1 ${DIRECTORIO_EJECUTABLES} | sed 's/.*/ --- &/'
	fi

	getAssoc 'CONFIGURACION' 'MAEDIR' DIRECTORIO_MAESTROS
	if [ -d $DIRECTORIO_MAESTROS ] 
	then
		echo
		echo " - Archivos Maestros:"

		ls -1 ${DIRECTORIO_MAESTROS} | sed 's/.*/ --- &/'	
	fi
	
	exit 3
fi


###############################################################################
# Inicializo archivo de log
LoguearW5.sh IniciarW5 'I' '1'


MOSTRAR_RESUMEN

###############################################################################
# En caso que la instalacion este correctamente finalizada
# me fijo si DetectaW5 no esta corriendo actualmente para invocarlo.
PID_DETECTA=`ps ax | grep DetectaW5 | grep -v LoguearW5 | grep -v grep | awk '{print $1}'`

if [ $PID_DETECTA ]
then
	echo
	echo "El proceso DETECTA_W5 ya se esta ejecutando con el PID $PID_DETECTA"
	LoguearW5.sh IniciarW5 'A' '7'

else
	CONF=( )
	getAssocKeys 'CONFIGURACION' CONF

	CANT_VARIABLES=${#CONF[@]}
	for ((i=0; i<CANT_VARIABLES; i++));
	do
		getAssoc 'CONFIGURACION' "${CONF[$i]}" 'VALOR_CONF'
		eval "${CONF[$i]}=${VALOR_CONF}; export ${CONF[$i]}"
	done
	
	# Flag de ejecucion de IniciaW5 exitoso, para chequeo en scripts subsiguientes.
	INICIAW5_EJECUTADO_EXITOSAMENTE=1
	export INICIAW5_EJECUTADO_EXITOSAMENTE

	# Comienzo de ejecucion del demonio DetectaW5
	bash DetectaW5.sh &
	sleep 0.3 
        
	PID_DETECTA=$(ps ax | grep DetectaW5 | grep -v LoguearW5 | grep -v grep | awk '{print $1}')
	let pid=$PID_DETECTA

	if [ $pid -gt 0 ]
	then
		echo "Demonio corriendo bajo el Nro <$PID_DETECTA>"
		echo "Proceso de inicializacion concluido con exito"
		LoguearW5.sh IniciarW5 'I' "Demonio corriendo bajo el Nro <$PID_DETECTA>"
	else
		echo "Proceso de inicializacion concluido sin exito"
		LoguearW5.sh IniciarW5 'E' '11'
	fi
fi

